package com.invernadero.invernaderotesis.Acceso_a_datos.DAOS;

import java.sql.Date;

import android.annotation.TargetApi;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.os.Build;

import com.invernadero.invernaderotesis.Acceso_a_datos.FabricaDAO.FabricaDAO;
import com.invernadero.invernaderotesis.Acceso_a_datos.iDAOS.*;
import com.invernadero.invernaderotesis.Modelo.Elementos.Conversion;
import com.invernadero.invernaderotesis.Modelo.Entidades.*;
import com.invernadero.invernaderotesis.Modelo.Entidades.Ambiente.*;
import com.invernadero.invernaderotesis.Modelo.Fabricas.FabricaElemento;
import com.invernadero.invernaderotesis.Modelo.Fabricas.FabricaEntidad;


public class DAOInvernadero extends DAO implements iDAOInvernadero{

	private Invernadero invernadero;
	
	public DAOInvernadero(Context context){
		super();
		
		this.setContext(context);
	}
	
	
	/*
	 * Atributos de la clase
	 */
	public Invernadero getInvernadero() {
		return invernadero;
	}

	public void setInvernadero(Invernadero invernadero) {
		this.invernadero = invernadero;
	}
    
	/**
	 * Insertamos un registro en la BD del tipo invernadero
	 * @param invernadero
	 * @param idCliente
	 * @return
	 */
	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public Boolean InsertarInvernadero(Entidad invernadero, int idCliente){
		
		Boolean result = false;
		// si un registro no se ha insertado, retorna -1
		Long idInsertado = (long) -1;
		int idVariable = 0; // Cantidad de registros actualizados
		
		SQLiteDatabase bd = FabricaDAO.CrearSQLiteDatabase(getContext());
		
		try{
			// Crea una instancia de tipo "ContentValues" que representa un registro de la BD
			// y es al que se de deben asignar los valores a insertar
			ContentValues registro = CrearRegistroInvernadero(((Invernadero)invernadero),idCliente);
						
			// Inserta el registro
			idInsertado = bd.insert("Invernadero", null, registro);
			result      = (idInsertado != (long) -1);

							
		}catch(SQLiteException e){
			
			  throw new SQLiteException("error al insertar el registro");
			  
		}finally{
			
			bd.close();
			//EliminarTemperatura(idinvernadero);
		}
		
		return result;
	}

	/**
	 * Consultamos el estado general del invernadero
	 */
	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public Entidad consultarEstadoInvernadero(Entidad invernadero){
		
		Boolean result = true;

        this.setInvernadero(((Invernadero)invernadero)); // seteamos el atributo del tipo invernadero
        
		SQLiteDatabase bd = FabricaDAO.CrearSQLiteDatabase(getContext());
		
		try{
			// Armamos el "Query" para extraer el ultimo id insertado
			String sql = this.getConsultaVariable();
			sql        = this.ObtenerConsultaVariable(sql,invernadero);
			
			// Ejecuta la consulta y re recibe en una variable de tipo "Cursor" para recorrer los resultados
			Cursor fila = bd.rawQuery(sql, null);
			// fila.moveToFirst(): retorna true (1) en caso que exista al menos un registro
			// retorna false (0) si no existen registros
			// Muestra el resultado de la consulta
			if (fila.moveToFirst() == true)
			{		
				// seteamos las consultadas
				SetVariablesInvernadero(fila);
				
			}else{
				
				// si el query no trae nada es por que la fecha excedio el limite de 3 min
				result = false;
			}
			
		}catch(SQLiteException e){
			
			throw new SQLiteException("error al consultar el registro");
			
		}finally{
			
			bd.close();
		
		}
		
		if (result)
		    return (this.getInvernadero());
		else{
			return null;
		}
	}
	
	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    public void IniciarSecuencia() {
		Boolean result = false;

		// si un registro no se ha insertado, retorna -1
		//Long idInsertado = (long) -1;
		int cant = 0; // Cantidad de registros actualizados

		// Accede a la BD y le pone por nombre "BdTerrae"
		SQLiteDatabase bd = FabricaDAO.CrearSQLiteDatabase(getContext());

		try
		{
			String Variable = "";
			cant = bd.delete("VariableInver", null, null);
			cant = bd.delete("TanqueInver", null, null);
			cant = bd.delete("PlantaInver", null, null);
			cant = bd.delete("Variable", null, null);
			cant = bd.delete("Tanque", null, null);
			cant = bd.delete("Planta", null, null);
			cant = bd.delete("Timer", null, null);
			cant = bd.delete("Invernadero", null, null);
			cant = bd.delete("Persona", null, null);
			Variable = "Variable";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			Variable = "Tanque";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			Variable = "Planta";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			Variable = "Timer";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			Variable = "Invernadero";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			Variable = "Persona";
			cant = bd.delete("sqlite_sequence", "name = '"+Variable+"'", null);
			result = (cant > 0);
		} catch (Exception e)
		{
			result = false;
			// 
		}
		finally
		{
			bd.close();
		}
		
		
	}
	/**
	 * Seteamos los objetos encasublados en el objeto del tipo "Invernadero"
	 * pasando por parametro el cursor de la consulta
	 * UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = 'MyTable'
	 * @param fila
	 * @return
	 */
	private void SetVariablesInvernadero(Cursor fila){

		String nombreVariable = fila.getString(1);
		String fecha = fila.getString(4);
		
		Conversion conversion = FabricaElemento.CrearConversion();
		
		if (nombreVariable.equals("Humedad")){
			Humedad humedad = (Humedad) FabricaEntidad.CrearHumedad();
			humedad.set_id(fila.getInt(0));
			humedad.set_nombre(fila.getString(1));
			humedad.setFecha(conversion.ConvertirFecha(fila.getString(2)));
			humedad.setMedicion(fila.getString(3));
			this.getInvernadero().set_humedad(humedad);
		}
		if (nombreVariable.equals("Temperatura")){
			Temperatura temperatura = (Temperatura) FabricaEntidad.CrearTemperatura();
			temperatura.set_id(fila.getInt(0));
			temperatura.set_nombre(fila.getString(1));
			temperatura.setFecha(conversion.ConvertirFecha(fila.getString(2)));
			temperatura.setMedicion(fila.getString(3));
			this.getInvernadero().set_temperatura(temperatura);
		}
		if (nombreVariable.equals("Acidez")){
			Acidez acidez = (Acidez) FabricaEntidad.CrearAcidez();
			acidez.set_id(fila.getInt(0));
			acidez.set_nombre(fila.getString(1));
			acidez.setFecha(conversion.ConvertirFecha(fila.getString(2)));
			acidez.setMedicion(fila.getString(3));
			this.getInvernadero().set_acidez(acidez);
		}
		if (nombreVariable.equals("Luminocidad")){
			Luminocidad luminocidad = (Luminocidad) FabricaEntidad.CrearLuminocidad();
			luminocidad.set_id(fila.getInt(0));
			luminocidad.set_nombre(fila.getString(1));
			luminocidad.setFecha(conversion.ConvertirFecha(fila.getString(2)));
			luminocidad.setMedicion(fila.getString(3));
			this.getInvernadero().set_luminocidad(luminocidad);
		}
		
		
	} //SetVariablesInvernadero
	
	private ContentValues CrearRegistroInvernadero(Invernadero invernadero, int idCliente)
	{
		// Crea una instancia de tipo "ContentValues" que representa un registro de la BD
		// y es al que se de deben asignar los valores a insertar
		ContentValues registro = new ContentValues();
		
		registro.put("nombre", invernadero.get_nombre());
		registro.put("descripcion", invernadero.get_descripcion());
		registro.put("fkPersona", idCliente);
		
		return registro;
	}
	
}
